package sdf;

import java.util.*;

//////////////////////////////////////////////////////////////////////////
//// MinMax
/**
        Guarda os valores minimos e maximos de um conjunto de canais.

@author Ivan Jeukens
@version v 0.1 30/06/2003
*/
public class MinMax  {

    public MinMax() {
        _max = new Vector();
        _min = new Vector();
    }

    ///////////////////////////////////////////////////////////////////
    ////                        public methods                     ////

    public boolean isHomogeneous() {
        for(int i = 0;i < _max.size();i++) {
            int M = getMax(i);
            int m = getMin(i);
            if(!(M == 1 && m == 1)) {
                return false;
            }
        }
        return true;
    }
    
    public Object clone() {
        MinMax clone = new MinMax();
        clone.setChannelSize(_max.size());

        for(int i = 0;i < _max.size();i++) {
            clone.incrMax(i, getMax(i));
        }
        for(int i = 0;i < _min.size();i++) {
            clone.incrMin(i, getMin(i));
        }

        return clone;
    }

    public void setChannelSize(int size) {
        _max = new Vector();
        for(int i = 0;i < size;i++) _max.add(new Integer(0));
            
        _min = new Vector();
        for(int i = 0;i < size;i++) _min.add(new Integer(0));
    }

    public void reset() {
        for(int i = 0;i < _min.size();i++) {
            _min.set(i, new Integer(0));
        }

        for(int i = 0;i < _max.size();i++) {
            _max.set(i, new Integer(0));
        }
    }

    public void update(MinMax minmax) {
        for(int i = 0;i < _min.size();i++) {
            int min = getMin(i);
            int min2 = minmax.getMin(i);

            if(min2 < min) {
                _min.setElementAt(new Integer(min2), i);
            }
        }

        for(int i = 0;i < _max.size();i++) {
            int max = getMax(i);
            int max2 = minmax.getMax(i);

            if(max2 > max) {
                _max.setElementAt(new Integer(max2), i);
            }
        }
    }

    public void incrMax(int channel, int value) {
        if(_max.size() < channel + 1) {
            _max.setSize(channel + 1);
        }

        Integer i = (Integer) _max.get(channel);
        if(i == null) {
            _max.set(channel, new Integer(value));
        }
        else {
            _max.set(channel, new Integer(value +  i.intValue()));
        }
    }

    public int maxSize() {
        return _max.size();
    }

    public int getMax(int channel) {
        if(channel > _max.size()) return 0;

        Integer i = (Integer) _max.get(channel);
        if(i == null) return 0;

        return i.intValue();
    }

    public void incrMin(int channel, int value) {
        if(_min.size() < channel + 1) {
            _min.setSize(channel + 1);
        }

        Integer i = (Integer) _min.get(channel);
        if(i == null) {
            _min.set(channel, new Integer(value));
        }
        else {
            _min.set(channel, new Integer(value +  i.intValue()));
        }
    }

    public int minSize() {
        return _min.size();
    }

    public int getMin(int channel) {
        if(channel > _min.size()) return 0;

        Integer i = (Integer) _min.get(channel);
        if(i == null) return 0;

        return i.intValue();
    }

    public String toString() {
        StringBuffer buf = new StringBuffer();

        buf.append("Min Values: ");
        for(int i = 0;i < _min.size();i++) {
            Integer s = (Integer) _min.get(i);
            if(s == null) {
                buf.append("0 ");
            }
            else {
                buf.append(s.intValue() + " ");
            }
        }
        buf.append("\n");

        buf.append("Max: ");
        for(int i = 0;i < _max.size();i++) {
            Integer s = (Integer) _max.get(i);
            if(s == null) {
                buf.append("0 ");
            }
            else {
                buf.append(s.intValue() + " ");
            }
        }
        buf.append("\n");

        return buf.toString();
    }

    ///////////////////////////////////////////////////////////////////
    ////                        private methods                    ////

    ///////////////////////////////////////////////////////////////////
    ////                        private variables                  ////

    private Vector _min;
    private Vector _max;
}
